我有一个逗号分隔文件"myfile.csv",其中第5列是日期/时间戳.(mm/dd/yyyy hh:mm).我需要列出包含重复日期的所有行(有很多)
我正在通过cygwin为WinXP使用bash shell
$ cut -d, -f 5 myfile.csv | sort | uniq -d
正确返回重复日期的列表
01/01/2005 00:22 01/01/2005 00:37 [snip] 02/29/2009 23:54
但我无法弄清楚如何将这个提供给grep给我所有的行.显然,我不能xargs
直接使用,因为输出包含空格.我认为我可以这样做,uniq -z -d
但由于某种原因,组合这些标志会导致uniq(显然)没有返回任何内容.
所以,鉴于此
$ cut -d, -f 5 myfile.csv | sort | uniq -d -z | xargs -0 -I {} grep '{}' myfile.csv
不起作用......我该怎么办?
我知道我可以做到这一点perl
或其他脚本语言......但我生性倔强坚持认为我应该能够做到这一点在bash
使用标准的命令行工具,如sort
,uniq
,find
,grep
,cut
,等.
教我,哦,打击大师.如何使用典型的cli工具获取所需的行列表?
sort -k5,5将对字段进行排序并避免剪切;
uniq -f 4将忽略uniq的前4个字段;
再加上uniq上的-D将获得所有重复的行(vs -d,它只能获得一个);
但uniq会期望使用制表符分隔而不是csv,所以tr'\ t'','来修复它.
问题是如果#5之后的字段不同.你的约会时间长度是一样的吗?您可以将-w 16(包含时间)或-w 10(仅适用于日期)添加到uniq.
所以:
tr '\t' ',' < myfile.csv | sort -k5,5 | uniq -f 4 -D -w 16